package com.tian.core.service;

import java.io.File;
import java.util.List;
import java.util.Map;

import org.hibernate.criterion.DetachedCriteria;

import com.tian.core.bean.Condition;
import com.tian.core.bean.PageList;
import com.tian.core.bean.Pages;

public interface BaseService<T> {
	/**
	 * 设置实体类
	 */
	public void setEntity(Class entityClass);
	
	/**
	 * 保存
	 * @param entity
	 * 			要保存的对象
	 * @return
	 */
	public T save(T entity);
	
	
	/**
	 * 删除对象
	 * @param entity
	 * 			要删除的对象
	 */
	public void delete(T entity);
	
	
	/**
	 * 通过对象的id值来删除对象
	 * @param id
	 * 			要删除对象的id
	 */
	public void delete(Integer id );
	
	
	/**
	 * 通过对象的id列表来删除对应的对象组
	 * @param ids
	 * 			要删除的一组对象的id组
	 */
	public void delete(String[] ids );
	
	
	/**
	 * 更新对象
	 * @param entity
	 * 			要更新的对象
	 */
	public void update(T entity);
	
	
	/**
	 * 通过对象的id来获取对象
	 * @param id
	 * 			要获取对象的id值
	 * @return
	 */
	public T get(Integer id );
	
	
	/**
	 * 通过对象的id来获取对象（延迟加载）
	 * @param id
	 * 			要获取对象的id值
	 * @return
	 */
	public T load(Integer id );
	
	
	/**
	 * 通过hql语句查询对象列表
	 * @param hql
	 * 			查询对象的hql语句
	 * @return
	 */
	public List<T> getListByHQL(String hql);
	/**
	 * 通过hql条件查询对象列表
	 * @return
	 */
	public List<T> getListByHQLCondition(String condition);
	
	
	/**
	 * 通过对象的某个属性值来获取对象
	 * @param propertyName
	 * 			属性名称
	 * @param value
	 * 			属性值
	 * @return
	 */
	public T get(String propertyName,Object value );
	
	
	/**
	 * 通过对象的某个属性值来获取对象列表
	 * @param propertyName
	 * 			属性名称
	 * @param value
	 * 			属性值
	 * @return
	 */
	public List<T> getList(String propertyName,Object value );
	
	
	/**
	 * 获取所有对象
	 * @return
	 */
	public List<T> getAll(Class entityClass);
	

	/**
	 * 获取总对象个数
	 * @return
	 */
	public Long getTotalCount(Class entityClass);
	
	/**
	 * 获取某属性最大数值
	 * @return
	 */
	public Integer getMax(String propertyName,Class entityClass);
	/**
	 * 查看是否存在某属性为特定值的对象
	 * @param propertyName
	 * 			属性名称
	 * @param value
	 * 			属性值
	 * @return
	 */
	public boolean isExist(String propertyName, Object value );
	
	
	/**
	 * 刷新session
	 */
	public void flush();
	

	/**
	 * 清除Session.
	 */
	public void clear();
	
	
	/**
	 * 清除某一对象.
	 * @param object
	 *            需要清除的对象
	 */
	public void evict(Object object);
	
	
	/**
	 * 根据Pager对象进行查询(提供分页、查找、排序功能)
	 * @param pager
	 * 			Pager对象
	 * @return
	 */
	public PageList findByPages(Pages pages );
	
	/**
	 * 根据conditions、Pager对象进行查询(提供分页、查找、排序功能)
	 * @param conditions
	 * @param pages
	 * @return
	 */
	public PageList findByPages(List<Condition> conditions, Pages pages );
	
	/**
	 * 根据Pager和DetachedCriteria对象进行查询(提供分页、查找、排序功能).
	 * @param pager
	 *            Pager对象
	 * @return Pager对象
	 */
	public PageList findByPages(Pages pages, DetachedCriteria detachedCriteria);
	
	
	/**
	 * 根据DetachedCriteria对象进行查询
	 * @param detachedCriteria
	 * @return
	 */
	public List<T> getListByDetachedCriteria(DetachedCriteria detachedCriteria);
	
	/**
	 * 通过hql语句和对应查询条件来查询对象列表
	 * @param hql
	 * 			查询对象的hql语句
	 * @param objects
	 * 			查询条件所对应的值
	 * @return
	 */
	public List<T> queryHQL(String hql,Map<Integer, String> params);
	
	/**
	 * 通过hql语句和对应条件来更新或删除对象
	 * @param hql
	 * 			更新或删除语句
	 * @param params
	 * 			更新或删除对象所需满足的条件
	 * @return
	 */
	public  Integer executeHQL(String hql, Map<Integer, String> params);
	
	/**
	 * 通过sql语句和对应查询条件来查询对象列表
	 * @param sql
	 * @param params
	 * @return
	 */
	public List querySQL(String sql, Map<Integer, String> params);
	
	/**
	 * 上传文件sourceFile到目录distFilePath下，并存储为distFileName文件
	 * @param sourceFile
	 * @param distFileName
	 * @param distFilePath
	 */
	public void uploadFile(File sourceFile, String distFileName, String distFilePath);
	
	
	public boolean isHasChildren(String[] ids);
}
